
package com.sundablog.result;

import java.util.List;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

/** 
 * 统一返回结果类
 * @ClassName:  BaseResult   
 * @Description:TODO(统一返回结果类)   
 * @author: 哒哒 
 * @date:   Oct 30, 2017 10:46:14 PM   
 *     
 * @Copyright: 2017 www.sundablog.com Inc. All rights reserved.
 */
public class BaseResult {
	
	/** 修改成功 */
	public static final String updataSuccess = "修改成功";
	
	/** 修改失败 */
	public static final String updataFail = "修改失败";
	
	/** 添加成功 */
	public static final String addSuccess = "添加成功";
	
	/** 添加失败 */
	public static final String addFail = "添加失败";
	
	/** 删除成功 */
	public static final String delectSuccess = "删除成功";
	
	/** 删除失败 */
	public static final String delectFail = "删除失败";
	
	/** 发送成功 */
	public static final String sendSuccess = "发送成功";
	
	/** 发送失败 */
	public static final String sendFail = "发送失败";
	
	/** 无数据 */
	public static final String selectFail = "无数据";
	
    /**
     * 定义jackson对象
     */
    private static final ObjectMapper MAPPER = new ObjectMapper();

    /**
     * 响应业务状态
     */
    private Integer status;

    /**
     * 响应消息
     */
    private String msg;

    /**
     * 响应中的数据
     */
    private Object data;

    public static BaseResult build(Integer status, String msg, Object data) {
        return new BaseResult(status, msg, data);
    }

    public static BaseResult ok(Object data) {
        return new BaseResult(data);
    }

    public static BaseResult ok() {
        return new BaseResult(null);
    }

    public BaseResult() {

    }

    public static BaseResult build(Integer status, String msg) {
        return new BaseResult(status, msg, null);
    }

    public BaseResult(Integer status, String msg, Object data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    public BaseResult(Object data) {
        this.status = 200;
        this.msg = "OK";
        this.data = data;
    }
    
    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    /**
     * 将json结果集转化为BaseResult对象
     * 
     * @param jsonData json数据
     * @param clazz BaseResult中的object类型
     * @return
     */
    public static BaseResult formatToPojo(String jsonData, Class<?> clazz) {
        try {
            if (clazz == null) {
                return MAPPER.readValue(jsonData, BaseResult.class);
            }
            JsonNode jsonNode = MAPPER.readTree(jsonData);
            JsonNode data = jsonNode.get("data");
            Object obj = null;
            if (clazz != null) {
                if (data.isObject()) {
                    obj = MAPPER.readValue(data.traverse(), clazz);
                } else if (data.isTextual()) {
                    obj = MAPPER.readValue(data.asText(), clazz);
                }
            }
            return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 没有object对象的转化
     * 
     * @param json
     * @return
     */
    public static BaseResult format(String json) {
        try {
            return MAPPER.readValue(json, BaseResult.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Object是集合转化
     * a
     * @param jsonData json数据
     * @param clazz 集合中的类型
     * @return
     */
    public static BaseResult formatToList(String jsonData, Class<?> clazz) {
        try {
            JsonNode jsonNode = MAPPER.readTree(jsonData);
            JsonNode data = jsonNode.get("data");
            Object obj = null;
            if (data.isArray() && data.size() > 0) {
                obj = MAPPER.readValue(data.traverse(),
                        MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
            }
            return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
        } catch (Exception e) {
            return null;
        }
    }

}
